package top.shiyiri.stream;

import org.junit.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @author Aunean
 * @date 2022/1/9
 */
/*
处理流之二：转换流的使用
1.转换流：属于字符流
    InputStreamReader：将一个字节的输入流转换为字符的输入流
    OutputStreamWriter：将一个字符的输出流转换为字节的输出流

2.作用：提供字节流与字符流之间的转换

3.解码：字节、字节数组  ->  字符数组、字符串
  编码：字符数组、字符串  ->  字节、字节数组

4.字符集

 */
public class InputStreamReaderTest {

    /*
    字节的输入流 -> 字符的输入流
     */
    @Test
    public void test1() throws IOException {

        FileInputStream fis = new FileInputStream("dbcp.txt");
        //InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符编码
        //参数二指明了字符集，具体使用哪个字符集，取决于文件保存时使用的字符集
        InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

        char[] chars = new char[20];
        int len;
        while ((len = isr.read(chars)) != -1) {

            String str = new String(chars, 0, len);
            System.out.println(str);
        }

        isr.close();
    }

    /*
    字符的输出流 -> 字节的输出流
    综合使用 OutputStreamWriter 和 InputStreamReader
     */
    @Test
    public void test2() throws IOException{
        FileInputStream fis = new FileInputStream("dbcp.txt");
        FileOutputStream fos = new FileOutputStream("dbcp_gbk.txt");

        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");

        char[] cbuf = new char[20];
        int len;
        while ((len = isr.read(cbuf)) != -1) {
            osw.write(cbuf, 0, len);
        }

        osw.close();
        isr.close();
    }
}
